390. Анаграммы

 

Анаграммой слова называется любая перестановка всех букв слова. Например, из слова SOLO можно получить 12 анаграмм: SOLO, LOSO, OSLO, OLSO, OSOL, OLOS, SLOO, LSOO, OOLS, OOSL, LOOS, SOOL.

Напишите программу, которая выводит количество различных анаграмм, которые могут получиться из этого слова.

 

Вход. В единственной строке задано слово, количество букв в котором не превышает 14.

 

Выход.  Количество различных анаграмм.

 

Пример входа

Пример выхода

SOLO

12

 

 

РЕШЕНИЕ

комбинаторика

 

Анализ алгоритма

Пусть мультимножество содержит n1 элементов a1, n2 элемента a2, … , nk элементов ak. Тогда число его перестановок равно полиномиальному коэффициенту

P(n1, n2, …, nk) =  = ,

где n = n1 + n2 + … + nk – общее число элементов в мультимножестве.

Вычислим количество перестановок мультимножества, используя сочетания: n1 элементов a1 можно расположить на n местах  способами. На следующих nn1 оставшихся местах можно расположить n2 элементов a2  способами. Рассуждая подобным образом, получаем, что nk элементов ak можно расположить  способами. Согласно правилу произведения имеем:

P(n1, n2, …, nk) =  *  * … *  =

 

Реализация алгоритма

Читаем входную строку, сортируем буквы в лексикографическом порядке. Изначально положим res = len!, где len равно длине строки.

 

gets(s); len = strlen(s);

sort(s,s+len);

c = 1;

res = fact(len);

 

Для каждого набора подряд идущих букв вычисляем его длину c. Делим значение len на c!.

 

for(i = 0; i < len - 1; i++)

  if (s[i] == s[i+1]) c++;

  else

  {

     res /= fact(c);

     c = 1;

  }

res /= fact(c);

 

Выводим результат res.

 

printf("%lld\n",res);